今回はarduino unoを使ってmidiデバイスとして使えるmidi音源に改造したいと思います。
こんな感じです。
Arduino
UNOでmidi 3和音 3 chords を再生
手順1
パソコンを用意します。
パソコンはwin/macどちらでも良いですが、今回はmacでやっていきたいと思います。
2.Xcodeの上のタブより、Preference→Locationsに行き、Command
Line Toolsの欄に何か書かれている(インストールされている)ことを確認してください。
私の場合はXcode 10.1 (10B61)
何もない場合はCommand Line Toolをインストールしてください。
3.MacPortsをインストールします。
4.インストール完了後、ターミナルより、[sudo port install dfu-programmer]を実行します。
手順2
Arduino
UNOをmidiデバイスとして認識(改造)させる。
1.まずarduinoをdfuモードに移行します。
写真にある、赤い丸同士をショート(結線)します。
その後、パソコンと接続します。
2.1で結線させてあったジャンパを抜きます。
GitHub - kuwatay/mocolufa: mocoLUFA (MIDI firmware for Arduino Uno)
4.ダウンロードしたファイルのうちの、dualMoco.hexというファイルだけをデスクトップへ移動します。
5.その後、ターミナルを起動し
dfu-programmer atmega16u2 erase dfu-programmer atmega16u2 flash /Users/*****/Desktop/dualMoco.hex *****はユーザー名です。 dfu-programmer atmega16u2 reset
これが完了したらひとまず、arduinoがmidiデバイスとして認識するはずです。
確認のため、midiを使えるソフトなどを立ち上げて確認します。
Alchemusicaというソフトで確認したところ、MocoLUFA-MocoLUFAというデバイスがありますが、これが改造したarduinoです。
手順3
arduinoにmidi信号を音信号に変換するプログラムを書き込みます。
1.写真にある箇所をショート(結線)させます。
このプログラムを書き込んでください。
#include <MIDI.h>
#include <Tone.h>
#define Speaker1 13
#define Speaker2 12
#define Speaker3 11
MIDI_CREATE_DEFAULT_INSTANCE();
int m2t[127] = {
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
3,
11,
19,
27,
35,
43,
51,
59,
67,
75,
83,
91,
99,
107,
115,
123, //NOTE_B2
131, //NOTE_C3
139, //NOTE_CS3
147, //NOTE_D3
156, //NOTE_DS3
165, //NOTE_E3
175, //NOTE_F3
185, //NOTE_FS3
196, //NOTE_G3
208, //NOTE_GS3
220, //NOTE_A3
233, //NOTE_AS3
247, //NOTE_B3
262, //NOTE_C4
277, //NOTE_CS4
294, //NOTE_D4
311, //NOTE_DS4
330, //NOTE_E4
349, //NOTE_F4
370, //NOTE_FS4
392, //NOTE_G4
415, //NOTE_GS4
440, //NOTE_A4
466, //NOTE_AS4
494, //NOTE_B4
523, //NOTE_C5
554, //NOTE_CS5
587, //NOTE_D5
622, //NOTE_DS5
659, //NOTE_E5
698, //NOTE_F5
740, //NOTE_FS5
784, //NOTE_G5
831, //NOTE_GS5
880, //NOTE_A5
932, //NOTE_AS5
988, //NOTE_B5
1047, //NOTE_C6
1109, //NOTE_CS6
1175, //NOTE_D6
1245, //NOTE_DS6
1319, //NOTE_E6
1397, //NOTE_F6
1480, //NOTE_FS6
1568, //NOTE_G6
1661, //NOTE_GS6
1760, //NOTE_A6
1865, //NOTE_AS6
1976, //NOTE_B6
2093, //NOTE_C7
2217, //NOTE_CS7
2349, //NOTE_D7
2489, //NOTE_DS7
2637, //NOTE_E7
2794, //NOTE_F7
2960, //NOTE_FS7
3136, //NOTE_G7
3322, //NOTE_GS7
3520, //NOTE_A7
3729, //NOTE_AS7
3951, //NOTE_B7
4186, //NOTE_C8
4435, //NOTE_CS8
4699, //NOTE_D8
4978 //NOTE_DS8
};
int vol = 0;
int tone1Interval = 0;
int tone2Interval = 0;
int tone3Interval = 0;
int note;
Tone tone1;
Tone tone2;
Tone tone3;
Tone tone4;
void setup() {
tone1.begin(Speaker1);
tone2.begin(Speaker2);
tone3.begin(Speaker3);
MIDI.begin(0);
}
void loop()
{
//音出力----------------------------------------------------------
uint8_t code;
uint8_t ch,data1,data2,Channel;
if (MIDI.read()) {
MIDI.setInputChannel(vol); // Channel
switch(MIDI.getType()) {
case midi::NoteOn:
data1 = MIDI.getData1(); // note no
data2 = MIDI.getData2(); // velocity
if(data2 == 0){
} else {
if(tone1Interval == 0){
tone1Interval = data1;
tone1.play(m2t[data1]);
}else{
if(tone2Interval == 0){
tone2Interval = data1;
tone2.play(m2t[data1]);
}else{
if(tone3Interval == 0){
tone3Interval = data1;
tone3.play(m2t[data1]);
}
}
}
}
break;
case midi::NoteOff:
data1 = MIDI.getData1(); // note no
if(tone1Interval == data1){
tone1Interval = 0;
tone1.stop();
}
if(tone2Interval == data1){
tone2Interval = 0;
tone2.stop();
}
if(tone3Interval == data1){
tone3Interval = 0;
tone3.stop();
}
break;
default:
break;
}
}
}